package com.ruoyi.business.service.impl;

import cn.hutool.core.lang.Console;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import com.ruoyi.business.service.CustomThreadService;
import org.springframework.stereotype.Service;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author Wu Yuwei
 * @Description:
 * @date 2022/11/2 22:57
 */
@Service
public class CustomThreadServiceImpl implements CustomThreadService {

    /**
     * 开始执行一个定时任务，执行方式分fixedRate模式和fixedDelay模式。
     * 注意：此方法的延迟和周期的单位均为毫秒。
     * fixedRate 模式：以固定的频率执行。每period的时刻检查，如果上个任务完成，启动下个任务，否则等待上个任务结束后立即启动。
     * fixedDelay模式：以固定的延时执行。上次任务结束后等待period再执行下个任务。
     */
    @Override
    public void customThreadPool() {
        ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(5);
        /**
         * Parameters:
         * executor - 定时任务线程池，null新建一个默认线程池
         * command - 需要定时执行的逻辑
         * initialDelay - 初始延迟，单位毫秒
         * period - 执行周期，单位毫秒
         * fixedRateOrFixedDelay - true表示fixedRate模式，false表示fixedDelay模式
         */
        ThreadUtil.schedule(scheduledThreadPoolExecutor,
                ()->{
                    runRandom();
                },
                10,
                10,
                TimeUnit.SECONDS,
                true
        );
    }

    public void runRandom() {
        // 测试的逻辑内容
        long delay = RandomUtil.randomLong(1, 10);
        ThreadUtil.sleep(delay);
        Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), delay);
    }
}
